// Keywords: 

initialize() {
	defineConstant("L", 1e6);               // chromosome length
	defineConstant("teInitialCount", 100);  // initial number of TEs
	defineConstant("teJumpP", 0.0001);      // TE jump probability
	defineConstant("teDisableP", 0.00005);  // disabling mut probability
	
	initializeMutationRate(1e-7);
	initializeMutationType("m1", 0.5, "f", 0.0);  // neutral
	initializeGenomicElementType("g1", m1, 1.0);
	initializeGenomicElement(g1, 0, L-1);
	initializeRecombinationRate(1e-8);
	
	// transposon mutation type; also neutral, but red
	initializeMutationType("m2", 0.5, "f", 0.0);
	m2.convertToSubstitution = F;
	m2.color = "#FF0000";
	
	// disabled transposon mutation type; dark red
	initializeMutationType("m3", 0.5, "f", 0.0);
	m3.convertToSubstitution = F;
	m3.color = "#700000";
}
1 late() {
	sim.addSubpop("p1", 500);
	
	sim.tag = 0;	// the next unique tag value to use for TEs
	
	// create some transposons at random positions
	genomes = sim.subpopulations.genomes;
	positions = rdunif(teInitialCount, 0, L-1);
	
	for (teIndex in 0:(teInitialCount-1))
	{
		pos = positions[teIndex];
		mut = genomes.addNewDrawnMutation(m2, pos);
		mut.tag = sim.tag;
		sim.tag = sim.tag + 1;
	}
}
modifyChild() {
	// disable transposons with rate teDisableP
	for (genome in child.genomes)
	{
		tes = genome.mutationsOfType(m2);
		teCount = tes.size();
		mutatedCount = teCount ? rpois(1, teCount * teDisableP) else 0;
		
		if (mutatedCount)
		{
			mutatedTEs = sample(tes, mutatedCount);
			
			for (te in mutatedTEs)
			{
				all_disabledTEs = sim.mutationsOfType(m3);
				disabledTE = all_disabledTEs[all_disabledTEs.tag == te.tag];
				
				if (size(disabledTE))
				{
					// use the existing disabled TE mutation
					genome.removeMutations(te);
					genome.addMutations(disabledTE);
					next;
				}
				
				// make a new disabled TE mutation with the right tag
				genome.removeMutations(te);
				disabledTE = genome.addNewDrawnMutation(m3, te.position);
				disabledTE.tag = te.tag;
			}
		}
	}
	
	return T;
}
late() {
	// make active transposons copy themselves with rate teJumpP
	for (individual in sim.subpopulations.individuals)
	{
		for (genome in individual.genomes)
		{
			tes = genome.mutationsOfType(m2);
			teCount = tes.size();
			jumpCount = teCount ? rpois(1, teCount * teJumpP) else 0;
			
			if (jumpCount)
			{
				jumpTEs = sample(tes, jumpCount);
				
				for (te in jumpTEs)
				{
					// make a new TE mutation
					pos = rdunif(1, 0, L-1);
					jumpTE = genome.addNewDrawnMutation(m2, pos);
					jumpTE.tag = sim.tag;
					sim.tag = sim.tag + 1;
				}
			}
		}
	}
}
5000 late() {
	// print information on each TE, including the fraction of it disabled
	all_tes = sortBy(sim.mutationsOfType(m2), "position");
	all_disabledTEs = sortBy(sim.mutationsOfType(m3), "position");
	genomeCount = size(sim.subpopulations.genomes);
	
	catn("Active TEs:");
	for (te in all_tes)
	{
		cat("   TE at " + te.position + ": ");
		
		active = sim.mutationCounts(NULL, te);
		disabledTE = all_disabledTEs[all_disabledTEs.tag == te.tag];
		
		if (size(disabledTE) == 0)
		{
			disabled = 0;
		}
		else
		{
			disabled = sim.mutationCounts(NULL, disabledTE);
			all_disabledTEs = all_disabledTEs[all_disabledTEs != disabledTE];
		}
		
		total = active + disabled;
		
		cat("frequency " + format("%0.3f", total / genomeCount) + ", ");
		catn(round(active / total * 100) + "% active");
	}
	
	catn("\nCompletely disabled TEs: ");
	for (te in all_disabledTEs)
	{
		freq = sim.mutationFrequencies(NULL, te);
		cat("   TE at " + te.position + ": ");
		catn("frequency " + format("%0.3f", freq));
	}
}
